package xml;


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;

/**
 * Created by :Infaraway
 * DATE : 2017/3/8
 * Time : 23:42
 * Funtion :
 *
	 * 修改xml内容
	 * 增加：文档，标签 ，属性
	 * 修改：属性值，文本
	 * 删除：标签，属性
 *
 */
public class WriteXml {

	/**
	 * 增加：文档，标签 ，属性
	 */
	@Test
	public void AddNode() throws Exception{

		//创建文档
		Document doc = DocumentHelper.createDocument();
		//增加标签
		Element rootElem = doc.addElement("UserList");
		Element userElem = rootElem.addElement("User");
		userElem.addElement("username");
		//增加属性值
		userElem.addAttribute("id", "001");
		userElem.addAttribute("username", "eric");
		
		writeXml(doc);
	}

	/**
	 * 修改：属性值，文本
	 * @throws Exception
     */
	@Test
	public void updateNode()	throws Exception{
		Document doc = new SAXReader().read(new File("./src/xml/userWrite.xml"));
		
		/**
		 * 方案一： 修改属性值   1.得到标签对象 2.得到属性对象 3.修改属性值
		 */
		//1.1 得到标签对象
		/*
		Element userElem = doc.getRootElement().element("User");
		//1.2 得到属性值
		Attribute idAttr = userElem.attribute("id");
		//1.3 修改属性值
		idAttr.setValue("003");
		*/
		/**
		 * 方案二： 修改属性值
		 */
		//1.1 得到标签对象
		/*
		Element userElem = doc.getRootElement().element("User");
		//1.2 通过增加同名属性的方法，修改属性值
		userElem.addAttribute("id", "004");
		*/

		/**
		 * 修改文本 1.得到标签对象 2.修改文本
		 */
		Element nameElem = doc.getRootElement().element("User").element("username");
		nameElem.setText("王五");

		//把修改后的Document对象写出到xml文档中
		writeXml(doc);
	}
	
	
	/**
	 * 删除：标签，属性
	 * @throws Exception
	 */
	@Test
	public void deleteNode() throws Exception{
		Document doc = new SAXReader().read(new File("./src/xml/userWrite.xml"));
		
		/**
		 * 1.删除标签   1.1 得到标签对象  1.2 删除标签对象
		 */
		// 1.1 得到标签对象
		/*
		Element ageElem = doc.getRootElement().element("User").element("age");
		//1.2 删除标签对象
		ageElem.detach();
		//ageElem.getParent().remove(ageElem);
		*/
		/**
		 * 2.删除属性   2.1得到属性对象  2.2 删除属性
		 */
		//2.1 得到属性对象
		//到第二个user标签
		Element userElem = (Element)doc.getRootElement().
			elements().get(0);
		//2.2 得到属性对象
		Attribute idAttr = userElem.attribute("id");
		//2.3 删除属性
		idAttr.detach();
		//idAttr.getParent().remove(idAttr);

		writeXml(doc);
	}

	/**
	 * 把修改后的Document对象写出到xml文档中
	 * @param document
	 * @throws IOException
     */
	public void writeXml(Document document) throws IOException {
		//把修改后的Document对象写出到xml文档中
		FileOutputStream out = new FileOutputStream("./src/xml/userWrite.xml");
		//比较美观的排版方式 用于人阅读
		OutputFormat format = OutputFormat.createPrettyPrint();

		//紧凑型的排版方式 ，主要用于程序运行中使用 减少不必要的空格换行等
		//OutputFormat format2 = OutputFormat.createCompactFormat();

		format.setEncoding("utf-8");
		XMLWriter writer = new XMLWriter(out,format);
		writer.write(document);
		writer.close();

	}
}
